//管理员操作函数定义
#include "head.h"

// 设定航班界面
const wchar_t *title_set_f = L"航班设定";
const wchar_t *option_set_f[] = {L"增加航班", L"删除航班", L"退出"};

// 增加超级用户
void add_admin()
{
    system("clear");
    char name[16];
    // 从文件中读取用户信息
    FlightSystem Flight_sys = Sys_init();
    // 用户信息合表
    u_list *list = init_u_list();
    list = merge_link_lists(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = merge_link_lists(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = merge_link_lists(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = merge_link_lists(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)
    print_u_list(list);               //打印所有用户信息
    puts("");
    text_center("请输入你要升级的用户名:",GREEN);
    scanf("%s",name);
    //查找对应用户名的结点并返回用户结构体
    user_data data = find_u_data_name(list,name);

    //保存对应等级用户表
    u_list *u = init_u_list();
    u = user_fscanf_by_level(data);

    // 删除原有链表用户的数据
    delete_u_node_byname(u, name);

    // 修改等级为管理员
    data.level = 1;
    // 找到对应等级的用户信息表
    u = user_fscanf_by_level(data);
    // 尾插到管理员数据表里面
    tail_insert_u_node(Flight_sys.ADMIN_USER, data);

    play_bgm(UP);
    printf("                                        \033[33m%s已升级为超级用户!\033[0m\n", name);
    sleep(1);
    // 停止并释放音乐
    Mix_HaltMusic();
    Mix_CloseAudio();
    return;
}

// 注销用户
void delete_users()
{
    system("clear");
    char name[16];
    // 从文件中读取用户信息
    FlightSystem Flight_sys = Sys_init();
    // 用户信息合表
    u_list *list = init_u_list();
    list = merge_link_lists(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = merge_link_lists(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = merge_link_lists(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = merge_link_lists(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)
    print_u_list(list);                                      // 打印所有用户信息
    puts("");
    text_center("请输入你要注销的用户名:", GREEN);
    scanf("%s", name);
    // 查找对应用户名的结点并返回用户结构体
    user_data data = find_u_data_name(list, name);

    // 保存对应等级用户表
    u_list *u = init_u_list();
    u = user_fscanf_by_level(data);

    // 删除原有链表用户的数据
    delete_u_node_byname(u, name);
    play_bgm(UP);
    printf("                                        \033[33m%s已注销!\033[0m\n", name);
    sleep(1);
    // 停止并释放音乐
    Mix_HaltMusic();
    Mix_CloseAudio();
    return;
}

// 修改用户信息
void Modify_U()
{
    system("clear");
    char name[16];
    // 从文件中读取用户信息
    FlightSystem Flight_sys = Sys_init();
    // 用户信息合表
    u_list *list = init_u_list();
    list = merge_link_lists(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = merge_link_lists(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = merge_link_lists(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = merge_link_lists(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)
    print_u_list(list);                                      // 打印所有用户信息
    puts("");
    text_center("请输入你要修改的用户名:", GREEN);
    scanf("%s", name);

    // 查找对应用户名的结点并返回用户结构体
    user_data data = find_u_data_name(list, name);
    // 从文件中读取数据
    u_list *u = init_u_list();
    u = user_fscanf_by_level(data);
    // 安全判断
    IsEmpty_link_u_List(u);
    u_node *p = u->next;
    while (strcmp(p->data.name, data.name))
    {
        if (p == NULL)
        {
            text_center("抱歉,查无此人!\n", RED);
            return;
        }
        p = p->next;
    }
    // 用户选择
    int select = 0;
    puts("");
    text_center("1--------用户:", GREEN);
    printf("%s\n", p->data.name);
    text_center("2--------密码:", GREEN);
    printf("%s\n", p->data.passwd);
    text_center("3--------性别:", GREEN);
    printf("%s\n", p->data.sex);
    text_center("4--------等级:", GREEN);
    printf("%d\n", p->data.level);
    text_center("5--------余额:", GREEN);
    printf("%d\n", p->data.value);
    text_center("       6--------累计充值:", GREEN);
    printf("%d\n", p->data.total_payment);
    text_center("       7--------手机号码:", GREEN);
    printf("%s\n", p->data.phone);
    puts("");

    text_center("请选择你要修改的的信息:", YELLOW);
    scanf("%d", &select);

    switch (select)
    {
    case 1:
        // 用户名
        text_center("请输入新的用户名:", YELLOW);
        scanf("%s", p->data.name);
        printf("%s\n", p->data.name);
        // 写入到文件
        user_fprint_by_level(u, "w+");
        puts("");
        text_center("修改成功!\n",YELLOW);
        printf("%s\t\t%s\t\t%s\t\t%d\t\t%s\t\t\t%d\t\t%d\n",
               p->data.name, p->data.passwd, p->data.sex, p->data.level, p->data.phone, p->data.value, p->data.total_payment);
        sleep(2);
        break;
    case 2:
        // 密码
        modify_passwd(data);
        break;
    case 3:
        // 性别
        text_center("请输入你的性别:", YELLOW);
        scanf("%s", p->data.sex);
        // 写入到文件
        user_fprint_by_level(u, "w+");
        puts("");
        text_center("修改成功!", YELLOW);
        printf("%s\t\t%s\t\t%s\t\t%d\t\t%s\t\t\t%d\t\t%d\n",
               p->data.name, p->data.passwd, p->data.sex, p->data.level, p->data.phone, p->data.value, p->data.total_payment);
        sleep(2);
        break;
    case 4:
        // 用户等级
        text_center("请输入新的等级:", YELLOW);
        scanf("%d", &p->data.level);
        u = user_fscanf_by_level(data);
        // 写入到文件
        user_fprint_by_level(u, "w+");
        puts("");
        text_center("修改成功!", YELLOW);
        printf("%s\t\t%s\t\t%s\t\t%d\t\t%s\t\t\t%d\t\t%d\n",
               p->data.name, p->data.passwd, p->data.sex, p->data.level, p->data.phone, p->data.value, p->data.total_payment);
        sleep(2);
        break;
    case 5:
        // 余额
        text_center("请输入新的余额:", YELLOW);
        scanf("%d", &p->data.value);
        // 写入到文件
        user_fprint_by_level(u, "w+");
        puts("");
        text_center("修改成功!", YELLOW);
        printf("%s\t\t%s\t\t%s\t\t%d\t\t%s\t\t\t%d\t\t%d\n",
               p->data.name, p->data.passwd, p->data.sex, p->data.level, p->data.phone, p->data.value, p->data.total_payment);
        sleep(2);
        break;
    case 6:
        // 累计充值金额
        text_center("请输入新的累计充值:", YELLOW);
        scanf("%d", &p->data.total_payment);
        // 写入到文件
        user_fprint_by_level(u, "w+");
        puts("");
        text_center("修改成功!", YELLOW);
        printf("%s\t\t%s\t\t%s\t\t%d\t\t%s\t\t\t%d\t\t%d\n",
               p->data.name, p->data.passwd, p->data.sex, p->data.level, p->data.phone, p->data.value, p->data.total_payment);
        sleep(2);
        break;
    case 7:
        // 手机号码
        text_center("请输入新的手机号码:", YELLOW);
        scanf("%s", p->data.phone);
        // 写入到文件
        user_fprint_by_level(u, "w+");
        puts("");
        text_center("修改成功!", YELLOW);
        printf("%s\t\t%s\t\t%s\t\t%d\t\t%s\t\t\t%d\t\t%d\n",
               p->data.name, p->data.passwd, p->data.sex, p->data.level, p->data.phone, p->data.value, p->data.total_payment);
        sleep(2);
        break;
    default:
        puts("");
        // 非法输入
        text_center("你输入的数字无效!\n:", RED);
        break;
    }
    return;
}

// 个人中心
void admin_center(user_data data)
{
    system("clear");
    // 从文件中读取数据
    u_list *u = init_u_list();
    u = user_fscanf_by_level(data);
    // 安全判断
    IsEmpty_link_u_List(u);
    u_node *p = u->next;
    while (strcmp(p->data.name, data.name))
    {
        if (p == NULL)
        {
            text_center("抱歉,查无此人!\n", RED);
            return;
        }
        p = p->next;
    }
    // 用户选择
    int select = 0;
    puts("");
    text_center("1--------用户:", GREEN);
    printf("%s\n", p->data.name);
    text_center("2--------密码:", GREEN);
    printf("%s\n", p->data.passwd);
    text_center("3--------性别:", GREEN);
    printf("%s\n", p->data.sex);
    text_center("4--------等级:", GREEN);
    printf("%d\n", p->data.level);
    // text_center("5--------余额:", GREEN);
    // printf("%d\n", p->data.value);
    // text_center("       6--------累计充值:", GREEN);
    // printf("%d\n", p->data.total_payment);
    text_center("       5--------手机号码:", GREEN);
    printf("%s\n", p->data.phone);
    puts("");

    text_center("有效数字1,2,3,5\n", YELLOW);
    text_center("请选择你要修改的的信息:", YELLOW);
    scanf("%d", &select);

    switch (select)
    {
    case 1:
        // 用户名
        text_center("请输入新的用户名:", YELLOW);
        scanf("%s", p->data.name);
        printf("%s\n", p->data.name);
        // 写入到文件
        user_data_file_print(u,ADMIN_FILE, "w+");
        break;
    case 2:
        // 密码
        modify_passwd(data);
        break;
    case 3:
        // 性别
        text_center("请输入你的性别:", YELLOW);
        scanf("%s", p->data.sex);
        // 写入到文件
        user_data_file_print(u, ADMIN_FILE, "w+");
        break;
    case 5:
        // 手机号码
        text_center("请输入新的手机号码:", YELLOW);
        scanf("%s", p->data.phone);
        // 写入到文件
        user_data_file_print(u, ADMIN_FILE, "w+");
        break;
    default:
        break;
    }
    return;
}


// 设定航班
void set_flight(f_list *list)
{
    int flag = display_menu(title_set_f, option_set_f, 3);
    switch (flag)
    {
    case 1:
        //增加航班
        add_flight(list);
        break;
    case 2:
        //删除航班
        delete_flight(list);
        break;
    default:
        break;
    }
}

// 增加航班
void add_flight(f_list *list)
{
    system("clear");
    //接收用户输入的信息
    f_data data;
    //初始化航班班次
    data.id = count_line(FLIGHTS_FILE);
    //默认为起飞
    data.whetherfly = 'y';
    int flag = 1;
    while (flag)
    {
        text_center("请按照以下要求添加航班:\n", YELLOW);
        puts("");
        text_center("请输入飞机机型:", GREEN);
        scanf("%s", data.flighttype);

        text_center("请输入航班起点:", GREEN);
        scanf("%s", data.startcity);

        text_center("请输入航班终点:", GREEN);
        scanf("%s", data.arrivecity);

        text_center("请输入起飞时间:", GREEN);
        scanf("%d", data.starttime);

        text_center("请输入达到时间:", GREEN);
        scanf("%d", data.arrivetime);

        text_center("请输入飞行时间:", GREEN);
        scanf("%s", data.flytime);

        text_center("请输入飞机票价:", GREEN);
        scanf("%d", &data.value);

        text_center("请输入额定载客量:", GREEN);
        scanf("%d", &data.maxNUM);

        // 初始化剩余座位数量
        data.leftbuyersa = data.maxNUM;

        puts("");
        // 确认信息
        text_center("请你核对新增航班信息:\n", YELLOW);
        printf("班次    机型            起点站         终点站           起飞时间        到达时间        飞行时间       票价           载客量         剩余座位    是否起飞\n");
        printf("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
        printf("%-6d\t", data.id);
        printf("%s\t\t", data.flighttype);
        printf("%s\t\t", data.startcity);
        printf("%s\t", data.arrivecity);
        printf("%02d:%02d\t\t", data.starttime[0], data.starttime[1]);
        printf("%02d:%02d\t\t", data.arrivetime[0], data.arrivetime[1]);
        printf("%s\t\t", data.flytime);
        printf("%d\t", data.value);
        printf("%d\t", data.maxNUM);
        printf("%d\t  ", data.leftbuyersa);
        printf("   %c\n", data.whetherfly);
        puts("");
        text_center("确认无误---0,重新输入---1:",GREEN);
        scanf("%d",&flag);
    }
    //尾插写入到文件
    insert_double_node(list, data, data.id+1);
    text_center("航班添加成功!",YELLOW);
    sleep(1);
    return;
}

// 删除航班
void delete_flight(f_list * list)
{
    system("clear");
    int num = 0;        //用户输入航班班次
    char select = '0';  //是否确认删除
    // 显示当前所有航班信息
    print_forward_double_link_list(list,0.5);
    puts("");
    text_center("请输入你要删除的班次:", GREEN);
    scanf("%d",&num);

    // 根据班次查找对应的航班信息数据结点
    f_node *p = find_double_node_id(list,&num);

    puts("");
    // 确认信息
    text_center("请你核对删除航班信息:\n", YELLOW);
    puts("");
    printf("班次    机型            起点站         终点站           起飞时间        到达时间        飞行时间       票价           载客量         剩余座位    是否起飞\n");
    printf("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
    //打印一条航班数据
    print_flight_1(p);
    puts("");
    // 确认删除
    text_center("是否删除该班次航班? y or n:", GREEN);
    scanf(" %c", &select);//加个空格作为缓冲区
    if ('y'==select)
    {
        // 删除对应位置的班次并保存到文件中
        delete_double_node(list, num);
        // printf("%s删除成功!", YELLOW);
        return;
    }
    return;
}

// 根据班次修改航班
void modify_flight(f_list *list)
{
    system("clear");
    int id = 0;     //输入班次
    // 显示当前所有班次
    sleep(1);
    print_forward_double_link_list(list,0.5);
    puts("");
    text_center("请输入你要修改的班次:", GREEN);
    scanf("%d",&id);
    // 找到对应班次的结点
    f_node *p = find_double_node_id(list, &id);
    //安全判断
    if (NULL==p)
    {
        text_center("抱歉, 暂无该班次航班 !\n",RED);
        return;
    }
    // 显示班次信息
    puts("");
    printf("班次    机型            起点站         终点站           起飞时间        到达时间        飞行时间       票价           载客量         剩余座位    是否起飞\n");
    print_flight_1(p);
    //用户选择操作
    int select = 0;
    puts("");
    text_center("1——更改机型\n", GREEN);
    text_center("2——更改航线\n", GREEN);
    text_center("3——更改时间\n", GREEN);
    text_center("请选择你要修改的内容:",GREEN);
    scanf("%d", &select);
    switch (select)
    {
    case 1:
        // 更改机型
        text_center("请输入新的机型:",GREEN);
        scanf("%s",p->data.flighttype);
        //写入到文件
        flight_data_file_print(list);
        text_center(" 机型已更改为:", GREEN);
        printf(" %s\n", p->data.flighttype);
        sleep(1.5);
        break;
    case 2:
        // 更改航线
        text_center("请输入新的航班起点站:", GREEN);
        scanf("%s", p->data.startcity);
        text_center("请输入新的航班终点站:", GREEN);
        scanf("%s", p->data.arrivecity);
        // 写入到文件
        flight_data_file_print(list);
        text_center(" 航线已更改为:", GREEN);
        printf("%s——%s\n", p->data.startcity, p->data.arrivecity);
        sleep(1.5);
        break;
    case 3:
        // 更改时间
        text_center("请输入新的起飞时间:", GREEN);
        scanf("%d:%d", &p->data.starttime[0], &p->data.starttime[1]);
        text_center("请输入新的到达时间:", GREEN);
        scanf("%d:%d", &p->data.arrivetime[0],&p->data.arrivetime[1]);
        text_center("请输入新的飞行时间:", GREEN);
        // 写入到文件
        flight_data_file_print(list);
        scanf("%s", p->data.flytime);
        text_center("航班时间已更改为:", GREEN);
        printf("%d:%d——%d:%d\n", p->data.starttime[0], p->data.starttime[1], p->data.arrivetime[0], p->data.arrivetime[1]);
        sleep(1.5);
        break;
    default:
        text_center("无效数字!\n",RED);
        break;
    }
    return;
}